#ifndef MESH_STRUCTURE_HPP
#define MESH_STRUCTURE_HPP

#include "../Math.hpp"
#include "VertexStructure.hpp"
#include <array>
#include <functional>
#include <list>
#include <memory>
#include <vector>

namespace Model {

/*
  网格数据结构，用于存取从文件中读取的网格数据以及，
  本地创建的网格数据
  要求：
  TODO: 通用性，外部任意格式的模型文件中的数据都能够以同一种数据布局
  存储在应用内存中
  */
class MeshData {
private:
  std::vector<uint32_t> indices;

  std::vector<float> _buffer;
  std::vector<VertexAttribFormat> _format;
  uint64_t _vert_count = 0;

  MeshData();

public:
  /* 创建一个空的网格数据结构 */
  static std::shared_ptr<MeshData> CreateMeshData();
  static void RemoveMesh(const std::shared_ptr<MeshData> &ref);

  void AssignIndex(const std::vector<uint32_t> &data);
  void Assign(const std::vector<float> &data,
              const std::vector<VertexAttribFormat> &vertFormat);
  void SortFormat();

  const uint32_t *MeshData::GetRawIndicesData() const { return indices.data(); }

  auto MeshData::GetIndicesCount() const { return indices.size(); }

  auto MeshData::GetVertCount() const { return _vert_count; }
  auto MeshData::GetBytes() const { return _buffer.size() * sizeof(float); }

  auto MeshData::GetFormat() const { return _format; }

  auto *GetBuffer() const { return _buffer.data(); }

  static void RemoveAll();

  ~MeshData();

private:
  static std::list<MeshData *> _caches;
};

using MeshRef = std::shared_ptr<MeshData>;

} // namespace Model

#endif